import org.junit.Ignore;
import org.junit.Test;

import java.io.IOException;
import java.net.URISyntaxException;

public class 测试书本示例代码 {

    private static String 执行(String 文件名) throws IOException, URISyntaxException {
        var 字节码 = Tools.读文件(Tools.getResourcePath(文件名));

        System.out.println("字节码：");
        System.out.println(字节码);
        System.out.println();
        
        var 汇编器 = 字节码汇编器.汇编(字节码);
        var 解释器 = new 解释器(true);

        var 反汇编器 = new 反汇编器(汇编器.机器码, 汇编器.取机器码尺寸(), 汇编器.常量池.toArray());
        反汇编器.反汇编();

        System.out.println("开始执行：");

        解释器.加载(汇编器.机器码, 汇编器.取机器码尺寸(), 汇编器.常量池.toArray(), 汇编器.入口函数, new Object[汇编器.取数据尺寸()]);
        解释器.执行();
        return 解释器.输出缓存.toString();
    }

    @Test
    public void TestT0() throws Exception {
        执行("t.pcode");
    }

    @Test
    public void TestT2() throws Exception {
        执行("t2.pcode");
    }

    @Test
    public void TestT3() throws Exception {
        执行("t3.pcode");
    }

    @Test
    public void TestT4() throws Exception {
        执行("t4.pcode");
    }

    @Test
    public void TestT5() throws Exception {
        执行("t5.pcode");
    }

    @Test
    public void TestT6() throws Exception {
        执行("t6.pcode");
    }

    @Test
    public void TestT7() throws Exception {
        执行("t7.pcode");
    }

    @Test
    public void TestT8() throws Exception {
        执行("t8.pcode");
    }

    @Test
    public void TestT9() throws Exception {
        执行("t9.pcode");
    }

    @Test
    public void TestStruct() throws Exception {
        执行("struct.pcode");
    }

    @Test
    public void TestFactorial() throws Exception {
        执行("factorial.pcode");
    }

    @Test
    @Ignore("这个似乎是死循环")
    public void TestLoop() throws Exception {
        执行("loop.pcode");
    }
}
